home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / ML_VECTB.ZIP / SOURCE / ENGINE3D.ASM < prev    next >
Assembly Source File  |  1996-03-10  |  9KB  |  290 lines

  1. COMMENT $
  2.   ----- Engine 3D -----
  3.   3D to 2D mapping routine, by Maple Leaf - 1996
  4. $
  5.  
  6. .386c
  7.  
  8. DATA  segment  word public use16
  9.       extrn    RotAngle:WORD
  10.       extrn    TiltAngle:WORD
  11.       extrn    Xt, Yt, Zt : DWORD
  12.       extrn    _3DX, _3DY, _3DZ : DWORD
  13.       extrn    _2DX, _2DY : DWORD
  14.       extrn    CenterX, CenterY : DWORD
  15.       extrn    SinTab:BYTE
  16.       extrn    CosTab:BYTE
  17.       extrn    ObserverX, ObserverY, ObserverDist : DWORD
  18.       extrn    TmpEqu:DWORD
  19.       extrn    Perspective:BYTE
  20.       extrn    ZoomFactor:WORD
  21.       extrn    CameraX, CameraY, CameraZ : DWORD
  22. DATA  ends
  23.  
  24. CODE  segment  byte public use16
  25.       assume   ds:DATA,cs:CODE
  26.  
  27.       public   IntMapCoordinates
  28.       public   IntMapCoordinates2
  29.  
  30. ;*****************************************************************************
  31.  
  32. IntMapCoordinates proc far
  33.     mov     si,RotAngle
  34.     mov     di,TiltAngle
  35.     shl     si,1
  36.     shl     si,1
  37.     shl     di,1
  38.     shl     di,1
  39.     ; ----- _3dx:=_3dx-CameraX -----
  40.     mov     eax,dword ptr _3DX
  41.     sub     eax,dword ptr CameraX
  42.     mov     dword ptr _3DX,eax
  43.     ; ----- _3dy:=_3dy-CameraY -----
  44.     mov     eax,dword ptr _3DY
  45.     sub     eax,dword ptr CameraY
  46.     mov     dword ptr _3DY,eax
  47.     ; ----- _3dz:=_3dz-CameraZ -----
  48.     mov     eax,dword ptr _3DZ
  49.     sub     eax,dword ptr CameraZ
  50.     mov     dword ptr _3DZ,eax
  51.     ; ----- Xt:=ObserverX+_3DX*CosA-_3DY*SinA -----
  52.     mov     eax,dword ptr _3DY
  53.     mov     ecx,dword ptr SinTab[si]
  54.     imul    ecx
  55.     mov     ebx,eax
  56.     mov     eax,dword ptr _3DX
  57.     mov     ecx,dword ptr CosTab[si]
  58.     imul    ecx
  59.     sub     eax,ebx
  60.     mov     ebx,dword ptr ObserverX
  61.     sal     ebx,8
  62.     add     eax,ebx
  63.     sar     eax,8
  64.     mov     dword ptr Xt,eax
  65.     ; -- Yt:= ObserverY + (_3DX*SinA + _3DY*CosA)*SinB + _3DZ*CosB; --
  66.     mov     eax,dword ptr _3DX
  67.     mov     ecx,dword ptr SinTab[si]
  68.     imul    ecx
  69.     mov     ebx,eax
  70.     mov     eax,dword ptr _3DY
  71.     mov     ecx,dword ptr CosTab[si]
  72.     imul    ecx
  73.     add     eax,ebx
  74.     sar     eax,8
  75.     mov     dword ptr TmpEqu,eax
  76.     mov     ecx,dword ptr SinTab[di]
  77.     imul    ecx
  78.     mov     ebx,eax
  79.     mov     eax,dword ptr _3DZ
  80.     mov     ecx,dword ptr CosTab[di]
  81.     imul    ecx
  82.     add     eax,ebx
  83.     mov     ebx,dword ptr ObserverY
  84.     sal     ebx,8
  85.     add     eax,ebx
  86.     sar     eax,8
  87.     mov     dword ptr Yt,eax
  88.     ; --- if perspective then begin ---
  89.     cmp     Perspective,1     ; Want perspective ? If yes, then another
  90.     jne     @NoPerspective    ; 6 more IMUL instructions will appear ... (half speed) - I really don't know how to optimize this shit ...  ;=)  f#$%^&* !!!
  91.     ; --- Zt:=ObserverDist+(_3DX*SinA+_3DY*CosA)*CosB-(_3DZ*SinB); ---
  92.     mov     eax,dword ptr TmpEqu
  93.     mov     ecx,dword ptr CosTab[di]
  94.     imul    ecx
  95.     mov     ebx,eax
  96.     mov     eax,dword ptr _3DZ        ;<--; This could be erased if ya want
  97.     mov     ecx,dword ptr SinTab[di]  ;   ; more speed, but some parts of the
  98.     imul    ecx                       ;   ; perspective will be lost ...
  99.     sub     ebx,eax                   ;<--; (e.g. One running-point)
  100.     mov     eax,dword ptr ObserverDist
  101.     sal     eax,8
  102.     add     eax,ebx
  103.     sar     eax,8
  104.     jnz     @@1
  105.     mov     eax,1     ; To prevent division by 0 ...
  106. @@1:mov     dword ptr Zt,eax
  107.     ; ---- _2DX:=CenterX+Trunc(Xt*ZoomFactor/Zt); ----
  108.     mov     eax,dword ptr Xt
  109.     mov     ecx,dword ptr ZoomFactor
  110.     imul    ecx
  111.     mov     ecx,dword ptr Zt
  112.     idiv    ecx
  113.     add     eax,dword ptr CenterX
  114.     mov     dword ptr _2DX,eax
  115.     ; ---- _2DY:=CenterY-Trunc(Yt*ZoomFactor/Zt*13/16); ----
  116.     mov     eax,dword ptr Yt
  117.     mov     ecx,dword ptr ZoomFactor
  118.     imul    ecx
  119.     mov     ecx,dword ptr Zt
  120.     idiv    ecx
  121.     ;
  122.     shl     eax,1        ; This part is the equivalent of:
  123.     mov     ebx,eax      ; -----------
  124.     shl     eax,1        ; mov ecx,13
  125.     add     ebx,eax      ; imul ecx
  126.     shl     eax,1        ; -----------
  127.     add     eax,ebx      ;
  128.     ;
  129.     sar     eax,4
  130.     mov     ebx,dword ptr CenterY
  131.     sub     ebx,eax
  132.     mov     dword ptr _2DY,ebx
  133.     jmp     @Outta
  134. @NoPerspective:
  135.     ; ---- _2DX:=CenterX+Trunc(Xt); ----
  136.     mov     eax,dword ptr Xt
  137.     add     eax,dword ptr CenterX
  138.     mov     dword ptr _2DX,eax
  139.     ; ---- _2DY:=CenterY-Trunc(Yt*13/16); ----
  140.     mov     eax,dword ptr Yt
  141.     ;
  142.     shl     eax,1        ; This part is the equivalent of:
  143.     mov     ebx,eax      ; -----------
  144.     shl     eax,1        ; mov ecx,13
  145.     add     ebx,eax      ; imul ecx
  146.     shl     eax,1        ; -----------
  147.     add     eax,ebx      ;
  148.     ;
  149.     sar     eax,4
  150.     mov     ebx,dword ptr CenterY
  151.     sub     ebx,eax
  152.     mov     dword ptr _2DY,ebx
  153. @Outta:
  154.     retf
  155. IntMapCoordinates endp
  156.  
  157. ;*****************************************************************************
  158.  
  159. IntMapCoordinates2 proc far
  160.     mov     si,RotAngle
  161.     mov     di,TiltAngle
  162.     shl     si,1
  163.     shl     si,1
  164.     shl     di,1
  165.     shl     di,1
  166.     ; ----- _3dx:=_3dx-CameraX -----
  167.     mov     eax,dword ptr _3DX
  168.     sub     eax,dword ptr CameraX
  169.     mov     dword ptr _3DX,eax
  170.     ; ----- _3dy:=_3dy-CameraY -----
  171.     mov     eax,dword ptr _3DY
  172.     sub     eax,dword ptr CameraY
  173.     mov     dword ptr _3DY,eax
  174.     ; ----- _3dz:=_3dz-CameraZ -----
  175.     mov     eax,dword ptr _3DZ
  176.     sub     eax,dword ptr CameraZ
  177.     mov     dword ptr _3DZ,eax
  178.     ; ----- Xt:=ObserverX+_3DX*CosA-_3DY*SinA -----
  179.     mov     eax,dword ptr _3DY
  180.     mov     ecx,dword ptr SinTab[si]
  181.     imul    ecx
  182.     mov     ebx,eax
  183.     mov     eax,dword ptr _3DX
  184.     mov     ecx,dword ptr CosTab[si]
  185.     imul    ecx
  186.     sub     eax,ebx
  187.     mov     ebx,dword ptr ObserverX
  188.     sal     ebx,8
  189.     add     eax,ebx
  190.     sar     eax,8
  191.     mov     dword ptr Xt,eax
  192.     ; -- Yt:= ObserverY + (_3DX*SinA + _3DY*CosA)*SinB + _3DZ*CosB; --
  193.     mov     eax,dword ptr _3DX
  194.     mov     ecx,dword ptr SinTab[si]
  195.     imul    ecx
  196.     mov     ebx,eax
  197.     mov     eax,dword ptr _3DY
  198.     mov     ecx,dword ptr CosTab[si]
  199.     imul    ecx
  200.     add     eax,ebx
  201.     sar     eax,8
  202.     mov     dword ptr TmpEqu,eax
  203.     mov     ecx,dword ptr SinTab[di]
  204.     imul    ecx
  205.     mov     ebx,eax
  206.     mov     eax,dword ptr _3DZ
  207.     mov     ecx,dword ptr CosTab[di]
  208.     imul    ecx
  209.     add     eax,ebx
  210.     mov     ebx,dword ptr ObserverY
  211.     sal     ebx,8
  212.     add     eax,ebx
  213.     sar     eax,8
  214.     mov     dword ptr Yt,eax
  215.     ; --- if perspective then begin ---
  216.     cmp     Perspective,1     ; Want perspective ? If yes, then another
  217.     jne     @NoPerspective2   ; 6 more IMUL instructions will appear ... (half speed) - I really don't know how to optimize this shit ...  ;=)  f#$%^&* !!!
  218.     ; --- Zt:=ObserverDist+(_3DX*SinA+_3DY*CosA)*CosB-(_3DZ*SinB); ---
  219.     mov     eax,dword ptr TmpEqu
  220.     mov     ecx,dword ptr CosTab[di]
  221.     imul    ecx
  222.     mov     ebx,eax
  223.     mov     eax,dword ptr _3DZ        ;<--; This could be erased if ya want
  224.     mov     ecx,dword ptr SinTab[di]  ;   ; more speed, but some parts of the
  225.     imul    ecx                       ;   ; perspective will be lost ...
  226.     sub     ebx,eax                   ;<--; (e.g. One running-point)
  227.     mov     eax,dword ptr ObserverDist
  228.     sal     eax,8
  229.     add     eax,ebx
  230.     sar     eax,8
  231.     jnz     @@2
  232.     mov     eax,1     ; To prevent division by 0 ...
  233. @@2:mov     dword ptr Zt,eax
  234.     ; ---- _2DX:=CenterX+Trunc(Xt*ZoomFactor/Zt); ----
  235.     mov     eax,dword ptr Xt
  236. ;    mov     ecx,dword ptr ZoomFactor
  237. ;    imul    ecx
  238.     shl     eax,8   ; ZoomFactor is 256 by default
  239.     cdq
  240.     mov     ecx,dword ptr Zt
  241.     idiv    ecx
  242.     add     eax,dword ptr CenterX
  243.     mov     dword ptr _2DX,eax
  244.     ; ---- _2DY:=CenterY-Trunc(Yt*ZoomFactor/Zt*13/16); ----
  245.     mov     eax,dword ptr Yt
  246. ;    mov     ecx,dword ptr ZoomFactor
  247. ;    imul    ecx
  248.     shl     eax,8   ; ZoomFactor is 256 by default
  249.     cdq
  250.     mov     ecx,dword ptr Zt
  251.     idiv    ecx
  252.     ;
  253.     shl     eax,1        ; This part is the equivalent of:
  254.     mov     ebx,eax      ; -----------
  255.     shl     eax,1        ; mov ecx,13
  256.     add     ebx,eax      ; imul ecx
  257.     shl     eax,1        ; -----------
  258.     add     eax,ebx      ;
  259.     ;
  260.     sar     eax,4
  261.     mov     ebx,dword ptr CenterY
  262.     sub     ebx,eax
  263.     mov     dword ptr _2DY,ebx
  264.     jmp     @Outta2
  265. @NoPerspective2:
  266.     ; ---- _2DX:=CenterX+Trunc(Xt); ----
  267.     mov     eax,dword ptr Xt
  268.     add     eax,dword ptr CenterX
  269.     mov     dword ptr _2DX,eax
  270.     ; ---- _2DY:=CenterY-Trunc(Yt*13/16); ----
  271.     mov     eax,dword ptr Yt
  272.     ;
  273.     shl     eax,1        ; This part is the equivalent of:
  274.     mov     ebx,eax      ; -----------
  275.     shl     eax,1        ; mov ecx,13
  276.     add     ebx,eax      ; imul ecx
  277.     shl     eax,1        ; -----------
  278.     add     eax,ebx      ;
  279.     ;
  280.     sar     eax,4
  281.     mov     ebx,dword ptr CenterY
  282.     sub     ebx,eax
  283.     mov     dword ptr _2DY,ebx
  284. @Outta2:
  285.     retf
  286. IntMapCoordinates2 endp
  287.  
  288. CODE  ends
  289.       end
  290.